'use strict';

const Controller = require('egg').Controller;

class UserController extends Controller {
  // 注册
	async reg() {
    const { ctx, app } = this; 
		// post请求参数
		let { username, password, repassword } = this.ctx.request.body
		// 插件会帮我们过滤没有配置验证的参数
		ctx.validate({
			username: { type: 'string', required: true, desc: '用户名' },
			password: { type: 'string', required: true, range: { min: 6, max: 20}, desc: '密码' },
			repassword: { type: 'string', required: true, range: { min: 6, max: 20}, desc: '确认密码' }
		},{
			// 两参数要相同
			equals: [ ['password', 'repassword'] ]
		});
    // 验证用户是否存在
		if(await app.model.User.findOne({
			where: { username }
		})) ctx.throw(400, '该用户已存在!')
		// 不存在，创建
		let user = await app.model.User.create({
			username, password
		})
		// 创建失败
		if(!user){
			ctx.throw(400, '创建用户失败')
		}
		ctx.apiSuccess(user)
  }
	
	// 登录
	async login(){
		const { ctx, app } = this;
		// 参数验证
		ctx.validate({
			username: { type: 'string', required: true, desc: '用户名' },
			password: { type: 'string', required: true, range: { min: 6, max: 20}, desc: '密码' },
		});
		let { username, password } = ctx.request.body
		// 用户是否存在，状态是否可用
		let user = await app.model.User.findOne({
			where: { username, status:1 }
		})
		if(!user){
			ctx.throw(400, '用户不存在或已禁用')
		}
		// 验证密码,验证失败会抛出异常,成功得到true
		await ctx.checkPassword(password, user.password)
		// 生成token,得到的user要转成单纯一个对象
		user = JSON.parse(JSON.stringify(user));
		// 生成token
		let token = ctx.getToken(user);
		// 把token加到user中
		user.token = token;
		// 删除返回给前端的密码信息
		delete user.password
		// 加入缓存
		if(!await this.service.cache.set('user_'+user.id, token, 36000)){
			ctx.throw(400, '登录失败')
		}
		// 返回用户信息
		return ctx.apiSuccess(user)
	}
	
	// 退出登录
	async logout(){
	    
		const { ctx,service,app } = this;
		// 当前用户id
		let current_user_id = ctx.authUser.id;
		// 移除redis缓存
		if(!await service.cache.remove('user_' + current_user_id)){
			ctx.throw(400, '退出失败!');
		}
	    // 确保退出成功
	    service.cache.remove('online_' + current_user_id);
		//app.messenger.broadcast('logout', current_user_id);
		ctx.apiSuccess('退出成功');
		
	}
	
	// 生成用户二维码
	async qrcode(){
		const { ctx, app } = this;
		ctx.qrcode(JSON.stringify({
			id: ctx.params.id,
			type: 'user'
		}))
	}
    
    
    async websocketErr(){
        const { ctx, app, service } = this;
        let current_user_id = ctx.authUser.id;
        // 这里会把新连接给删除
        //app.messenger.broadcast('removeAppUserObject', current_user_id);
        service.cache.remove('online_' + current_user_id);
    }


	// 修改个人资料
	async update(){
		 const { ctx, app } = this;
			ctx.validate({
				avatar: {
					type: 'url',
					required: false,
					defValue: "",
					desc: '头像'
				},
				nickname: {
					type: 'string',
					required: false,
					defValue: "",
					desc: '昵称'
				},
			});

			let { avatar, nickname } = ctx.request.body;
			ctx.authUser.avatar = avatar;
			ctx.authUser.nickname = nickname;
			await ctx.authUser.save();

			return ctx.apiSuccess('ok');
	}
}

module.exports = UserController;
